配置文件
find_package(Qt6 COMPONENTS SerialBus REQUIRED)
target_link_libraries(switchUnit PRIVATE Qt6::SerialBus)
刷新串口
/*--------------------widget.h --------------------*/
#include <QSerialPortInfo>
void updateSerialPortsList();
/*--------------------widget.cpp --------------------*/
//封装成函数
void Widget::updateSerialPortsList()
{
ui->comboBox_COM->clear();//刷新前先清除下拉菜单
const auto serialPorts = QSerialPortInfo::availablePorts();//可用端口
//查找串口
for (const QSerialPortInfo &portInfo : serialPorts) { //???
QString portDescription = portInfo.portName();//???
if (!portInfo.description().isEmpty()) {//???
portDescription += " (" + portInfo.description() + ")";//???
}
//将找到的串口添加到下拉菜单
ui->comboBox_COM->addItem(portDescription, portInfo.portName());
}
//输出串口数量
if (ui->comboBox_COM->count() > 0) { //启用
ui->label->setText("找到 " + QString::number(ui->comboBox_COM->count()) + " 个串口");
} else {
ui->label->setText("未找到串口 😰");
}
}
const auto serialPortInfos = QSerialPortInfo::availablePorts();//???
for (const QSerialPortInfo &portInfo : serialPortInfos) { //???
qDebug() << "\n"//???
<< "Port:" << portInfo.portName() << "\n"//???
<< "Location:" << portInfo.systemLocation() << "\n"//???
<< "Description:" << portInfo.description() << "\n"//???
<< "Manufacturer:" << portInfo.manufacturer() << "\n"//???
<< "Serial number:" << portInfo.serialNumber() << "\n"//???
<< "Vendor Identifier:"//???
<< (portInfo.hasVendorIdentifier()//???
? QByteArray::number(portInfo.vendorIdentifier(), 16)//???
: QByteArray()) << "\n"//???
<< "Product Identifier:"//???
<< (portInfo.hasProductIdentifier()//???
? QByteArray::number(portInfo.productIdentifier(), 16)//???
: QByteArray());//???
}
/*--------------------widget.h --------------------*/
#include <QMessageBox>
#include <QModbusRtuSerialMaster>
void fn_connect();//连接函数
QModbusRtuSerialClient *RTU_Device = nullptr;//对应#include < QModbusRtuSerialMaster>
int connectSign = 0;//连接信号,判断连接按钮显示“断开”或“连接”
/*--------------------widget.cpp --------------------*/
void Widget::fn_connect()
{
RTU_Device = new QModbusRtuSerialClient(this);//建立主站
QString COM = ui->comboBox_COM->currentData().toString();//读取当前选中项关联的数据
//配置串口参数
RTU_Device->setConnectionParameter (QModbusDevice::SerialPortNameParameter, COM);
RTU_Device->setConnectionParameter (QModbusDevice::SerialBaudRateParameter, QSerialPort::Baud9600);
RTU_Device->setConnectionParameter (QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8);
RTU_Device->setConnectionParameter (QModbusDevice::SerialParityParameter, QSerialPort::NoParity);
RTU_Device->setConnectionParameter (QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop);
//连接成功信号
connect(RTU_Device, &QModbusClient::stateChanged, this, [=](QModbusDevice::State state)
{
if (state == QModbusDevice::ConnectedState){
qDebug() << "Modbus RTU 连接成功!";
} else if (state == QModbusDevice::ConnectingState) {
qDebug() << "正在建立Modbus RTU 连接 . . .";
} else if (state == QModbusDevice::ClosingState) {
qDebug() << "Modbus RTU 连接正在关闭 . . .";
} else if (state == QModbusDevice::UnconnectedState) {
qDebug() << "Modbus RTU 连接已断开";
}
}
);
}
//连接按钮(弹窗提示)
void Widget::on_pushButton_connect_clicked()
{
if (connectSign == 0){
fn_connect();
bool connected = RTU_Device->connectDevice();
if (connected){
ui->pushButton_connect->setText("断开");
connectSign = 1;
}else{
QMessageBox::critical(this, "错误", "无法打开串口: " + RTU_Device->errorString());
}
}else{
RTU_Device->disconnectDevice();
ui->pushButton_connect->setText("连接");
connectSign = 0;
}
}